package algorithm.dp;

/**
 * @author apple
 * @Classname DynamicProgramming2
 * @Description 动态规划_2
 * @Date 2020/4/24 21:43
 */
public class DynamicProgramming2 {
    /**
     * 机器人走格子  无障碍的网格
     * 有一个XxY的网格，一个机器人只能走格点且只能向右或向下走，要从左上角走到右下角。
     * 请设计一个算法，计算机器人有多少种走法。
     * 给定两个正整数int x,int y表示网格的大小，计算机器人的走法数目。
     **/
    public static int uniquePaths(int m, int n) {
        if (m <= 0 || n <= 0) {
            return 0;
        }
        int[] dp = new int[n];
        for (int i = 0; i < n; i++) {
            dp[i] = 1;
        }
        for (int i = 1; i < m; i++) {
            dp[0] = 1;
            for (int j = 1; j < n; j++) {
                dp[j] = dp[j - 1] + dp[j];
            }
        }
        return dp[n - 1];
    }

    /**
     * 有障碍的格子
     * 给定一个int[][]map表示网格图，
     * 若map[i][j]=0则说明该点不是障碍点，map[i][j]=1表示为障碍点。
     * 计算机器人从(0,0)走到(x - 1,y - 1)的走法数。
     * 防止溢出，结果Mod 1000000007
     **/
    public static int countWays(int[][] map, int x, int y) {
        // write code here
        int[][] res = new int[x][y];
        res[0][0] = 0;
        //这里要注意，起点有障碍，那么直接返回0
        if (map[0][0] == 1) {
            return 0;
        }
        //标志位，用来标识前方是否有障碍
        boolean flag = true;
        for (int i = 1; i < x; i++) {
            if (map[i][0] == 1) {
                //有障碍则进行标识
                flag = false;
            }
            //依照障碍进行不同的操作
            if (flag) {
                res[i][0] = 1;
            } else {
                res[i][0] = 0;
            }
        }
        flag = true;

        for (int i = 1; i < y; i++) {
            if (map[0][i] == 1) {
                flag = false;
            }
            if (flag) {
                res[0][i] = 1;
            } else {
                res[0][i] = 0;
            }
        }

        for (int i = 1; i < x; i++) {
            for (int j = 1; j < y; j++) {
                if (map[i][j] == 0) {
                    res[i][j] = (res[i - 1][j] + res[i][j - 1]) % 1000000007;
                } else {
                    res[i][j] = 0;
                }
            }
        }
        return res[x - 1][y - 1];
    }


    public static void main(String[] args) {

        /**机器人走格子**/
        System.out.println("机器人走格子");
        int m=5;
        int n=4;
        System.out.println(uniquePaths(m,n));

        /**机器人走格子 有障碍**/
        System.out.println("机器人走格子 有障碍");
    
        int[][] map=new int[m][n];
        /**设置障碍**/
        map[3][2]=1;
        map[3][1]=1;
        map[3][3]=1;
        System.out.println(countWays(map,5,4));
    }
}
